﻿using PhraseCorrector.Common;
using PhraseCorrector.DirectTanslate;
using PhraseCorrector.Init;
using PhraseCorrector.SimplePinyin;
using PhraseCorrector.SpellCorrect;
using PhraseCorrector.WordLineSplit;
using static System.Net.Mime.MediaTypeNames;

namespace PhraseCorrector {
    /// <summary>
    /// 拼写校正类，用于对中文和英文文本进行拼写校正和翻译。
    /// 默认情况下，PhraseCorrect类将使用内置的词库进行拼写校正和翻译。
    /// 同时，PhraseCorrect类还支持自定义词库，以实现对特定领域或语言的拼写校正和翻译。
    /// 最后，PhraseCorrect类还支持自定义词库的加载和卸载，以实现对动态数据的支持。
    /// </summary>
    public class PhraseCorrect : IPhraseCorrect
    {
        #region 私有成员变量

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 用于同步初始化的锁对象
        /// </summary>
        private static readonly object InitLock = new object();

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 初始化状态
        /// </summary>
        private static bool isInitialized;
        #endregion

        #region 初始化

        public PhraseCorrect(LibraryType DicsModle = LibraryType.Specific) {
            BasePath.DicsModel = DicsModle;
            new Logger();
            Initialize();
        }

        private void Initialize() {
            lock (InitLock) {
                if (!isInitialized) {
                    new LoadLibraries();
                    isInitialized = true;
                }
            }
        }

        #endregion

        #region 拼音分词、汉字拼音、拼音纠错

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 获取给定中文文本的拼音。
        /// </summary>
        /// <param name="text">要获取拼音的中文文本。</param>
        /// <returns>单词的拼音。</returns>
        public string GetPinyin(string text)
        {
            if (string.IsNullOrWhiteSpace(text)) return "";
            return Pinyin.GetPinyin(text);
        }

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 根据拼音获取对应的中文文本。
        /// </summary>
        /// <param name="pinyin">要转换的拼音。</param>
        /// <returns>返回对应的中文文本。</returns>
        public PhraseResult GetPyText(string pinyin)
        {
            if (string.IsNullOrWhiteSpace(pinyin)) return new PhraseResult();
            return PinyinTranslator.SpellPhraseCorrect(pinyin);
        }


        #endregion

        #region 中文纠错

        ////////////////////////////////////////////////////////////////////////////           
        /// <summary>
        /// 纠正中文术语的拼写错误,得到在最大距离内相似度最高的修正术语。
        /// </summary>
        /// <param name="phraseString">需要纠错的中文术语。</param>
        /// <returns>返回一个ECResult对象，包含纠错后的英文、中文、拼音，以及器最大错误距离和相似度。</returns>
        public PhraseResult ChinesePhraseCorrect(string phraseString)
        {
            if (string.IsNullOrWhiteSpace(phraseString)) return new PhraseResult();
            // 使用ChineseSpell类的SpellPhraseCorrect方法对中文术语进行拼写纠正
            return ChineseTraslator.SpellPhraseCorrect(phraseString);
        }

        #endregion

        #region 西文纠错

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 检查并纠正英语短语的拼写错误。
        /// </summary>
        /// <param name="text">需要进行拼写检查的英语短语。</param>
        /// <returns>返回一个ECResult对象，其中包含了翻译后的中文、英文及拼音属性，以及距离和相似度。</returns>
        public PhraseResult EnglishPhraseCorrect(string text)
        {
            if(string.IsNullOrWhiteSpace(text))return new PhraseResult();
            // 调用英语拼写检查方法对短语进行拼写纠正，并返回纠正结果及状态
            return EnglishTraslator.SpellPhraseCorrect(text.ToLower());
        }
        #endregion

        #region 中/西文/拼音对照纠错

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 通过提供的中文、英文或拼音关键字进行中英文匹配。
        /// </summary>
        /// <param name="chinese">包含中文关键字的源对象。</param>
        /// <param name="letters">包含英文/拼音关键字的源对象。</param>
        /// <returns>返回一个新的ECResult对象，包含匹配结果。</returns>
        public PhraseResult ChineseEnglishPinyinMache(string chinese, string letters)
        {
            // 检查输入参数是否均为空或空格，是则返回空结果
            if (string.IsNullOrWhiteSpace(chinese) && string.IsNullOrWhiteSpace(letters)) return new PhraseResult();
            // 如果其中一个参数为空，则调用对应的翻译方法
            if(string.IsNullOrWhiteSpace(letters)) return EnPyMache(letters);
            if(string.IsNullOrWhiteSpace(letters)) return ChineseTraslator.SpellPhraseCorrect(chinese);
            // 调用匹配检查方法，返回匹配结果
            return  new ChnEnGPyMache(chinese, letters).SuggestResult;
        }
        private PhraseResult  EnPyMache(string letters)
        {
            var term = letters.Split(" ");
            if(term.Length < 7 && !string.IsNullOrEmpty(GetPinyin(term[0]))){
                return PinyinTranslator.SpellPhraseCorrect(letters);
            }
            return EnglishPhraseCorrect(letters);
        }

        #endregion

        #region 中/西文/拼音/数字解析纠错

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 匹配检查字词在行中的状态，并通过提供的中文、英文或拼音关键字进行中英文匹配
        /// </summary>
        /// <param name="line">待检查的行</param>
        /// <returns>返回一个新的ECResult对象，包含匹配结果。</returns>
        public PhraseResult WordLineMache(string line)
        {
            if (string.IsNullOrWhiteSpace(line)) return new PhraseResult();
            // 将行分割成多个部分，以便进行匹配检查
            var splitresult = LineWordSplit.Split(line);
            // 调用重载方法，传入原行和分割结果，返回匹配检查结果
            return WordLineMache(line, splitresult);
        }

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 进行单词行匹配处理。
        /// 该方法接收一个字符串和一个ECResult对象，通过对字符串进行处理，生成一个新的ECResult对象并返回。
        /// 主要用于语言翻译或转换过程中，对给定的中英文字符串进行详细分析和处理。
        /// </summary>
        /// <param name="line">待处理的字符串行。</param>
        /// <param name="splitresult">一个ECResult对象，包含了预处理或分割后的中文、英文字符串以及数字信息。</param>
        /// <returns>返回一个新的ECResult对象，包含了处理后的结果信息。</returns>
        private PhraseResult WordLineMache(string line, PhraseResult splitresult)
        {
            // 创建一个ChnEnGPyMache对象，用于进一步处理splitresult中的中文和英文内容
            var result= new ChnEnGPyMache(splitresult.Chinese, splitresult.Words).SuggestResult;
            // 将输入的splitresult中的Digits信息直接赋值给新结果的Digits属性，保持数字信息不变
            result.Digits= splitresult.Digits;
            // 返回处理后的结果对象
            return result;
        }
        #endregion
    }
}
